package com.debao.quartz.task;

import cn.hutool.core.date.DateException;
import cn.hutool.core.date.DateUtil;
import com.debao.common.constant.Constants;
import com.debao.common.core.domain.R;
import com.debao.common.core.domain.entity.SysUser;
import com.debao.system.domain.UserCourseCard;
import com.debao.system.service.ISysUserService;
import com.debao.system.service.IUserCourseCardService;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 每天去统计周期性用户课程是否过期
 */
@Component("serCourseTask")
public class UserCourseTask {
    @Resource
    private IUserCourseCardService courseCardService;
    @Resource
    private ISysUserService userService;

    private final ReentrantLock lock = new ReentrantLock();


    private String templateId = "jWq9X4X5xjx8W5z1X7X8X9X";


    public void updateStatus(){
        //获取所有没有过期的用户课程
        List<UserCourseCard> userCourseCards = courseCardService.selectUserCourseCardList(new UserCourseCard().setStatus(Constants.STATUS_1));
        for (UserCourseCard userCourseCard : userCourseCards) {
            //查询用户信息
            SysUser user = userService.selectUserById(userCourseCard.getUserId());
            try {
                // 比较当前时间与过期时间
                int compare = DateUtil.compare(new Date(), DateUtil.parse(userCourseCard.getEndAt(), "yyyy-MM-dd"), "yyyy-MM-dd");
                if (compare > 0) { // 已经过期
                    // 更新状态
                    userCourseCard.setStatus(Constants.STATUS_N);
                    updateUserCardStatus(userCourseCard);
                    //微信公众号推送消息
                    //todo
                }
            } catch (DateException e) {
                // 处理日期解析异常
                System.err.println("日期解析错误: " + e.getMessage());
            }
        }

    }
    // 原子性更新用户卡片状态的方法
    private synchronized void updateUserCardStatus(UserCourseCard userCourseCard) {
        try {
            if (lock.tryLock()) {
                try {
                    courseCardService.updateUserCourseCard(userCourseCard);
                } finally {
                    lock.unlock();
                }
            } else {
                System.err.println("无法获取锁" );
            }
        } catch (Exception e) {
            // 处理更新过程中的异常
            System.err.println("更新周期课程状态失败: " + e.getMessage());
        }
    }
}
